#ifndef FOLDER_H
#define FOLDER_H

#include <string>
#include <set>

class Folder;

class Message {
    friend class Folder;
    friend void swap(const Message&, const Message&);
public:
    // folders 被隐式初始化为空集合
    explicit Message(const std::string &str = "") :
        contents(str) { }
    // 拷贝控制成员,用来管理指向本 Message 的指针
    Message(const Message&);    // 拷贝构造函数
    Message& operator =(const Message&);    // 拷贝赋值运算符
    ~Message(); // 析构函数
    // 从给定 Folder 集合中添加/删除本 Message
    void save(Folder&);
    void remove(Folder&);
private:
    std::string contents;       // 实际消息文本
    std::set<Folder*> folders;  // 包含本 Message 的 Folder
    // 拷贝构造函数、赋值拷贝运算符和析构函数所使用的工具函数
    // 将本 Message 添加到指向参数的 Folder 中
    void add_to_Folders(const Message&);
    // 从 folders 中的每个 Folder 中删除本 Message
    void remove_from_folders();

    void addFldr(Folder *f) { folders.insert(f); }
    void remFldr(Folder *f) { folders.erase(f); }
};

class Folder
{
public:
    Folder(const Folder&);
    Folder &operator =(const Folder&);
    ~Folder();
    void addMsg(Message *m) { msgs.insert(m); }
    void remMsg(Message *m) { msgs.erase(m); }
private:
    std::set<Message*> msgs;    // 保存文件夹中所有消息的指针

    void add_to_message(const Folder&); // 将这个 Folder 添加到所有 Message 中
    void remove_from_msgs();    // 将这个 Folder 从它所有 Message 中删除
};

#endif // FOLDER_H
